home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / programming / emacs-complete / fsf / emacs / lisp / novice.el < prev    next >
Lisp/Scheme  |  1994-05-04  |  5KB  |  132 lines

  1. ;;; novice.el --- handling of disabled commands ("novice mode") for Emacs.
  2.  
  3. ;; Copyright (C) 1985, 1986, 1987, 1994 Free Software Foundation, Inc.
  4.  
  5. ;; Maintainer: FSF
  6. ;; Keywords: internal, help
  7.  
  8. ;; This file is part of GNU Emacs.
  9.  
  10. ;; GNU Emacs is free software; you can redistribute it and/or modify
  11. ;; it under the terms of the GNU General Public License as published by
  12. ;; the Free Software Foundation; either version 2, or (at your option)
  13. ;; any later version.
  14.  
  15. ;; GNU Emacs is distributed in the hope that it will be useful,
  16. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. ;; GNU General Public License for more details.
  19.  
  20. ;; You should have received a copy of the GNU General Public License
  21. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  22. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  
  24. ;;; Commentary:
  25.  
  26. ;; This mode provides a hook which is, by default, attached to various
  27. ;; putatively dangerous commands in a (probably futile) attempt to
  28. ;; prevent lusers from shooting themselves in the feet.
  29.  
  30. ;;; Code:
  31.  
  32. ;; This function is called (by autoloading)
  33. ;; to handle any disabled command.
  34. ;; The command is found in this-command
  35. ;; and the keys are returned by (this-command-keys).
  36.  
  37. ;;;###autoload
  38. (setq disabled-command-hook 'disabled-command-hook)
  39.  
  40. ;;;###autoload
  41. (defun disabled-command-hook (&rest ignore)
  42.   (let (char)
  43.     (save-window-excursion
  44.      (with-output-to-temp-buffer "*Help*"
  45.        (if (eq (aref (this-command-keys) 0)
  46.            (if (stringp (this-command-keys))
  47.            (aref "\M-x" 0)
  48.          ?\M-x))
  49.        (princ "You have invoked the disabled command ")
  50.      (princ "You have typed ")
  51.      (princ (key-description (this-command-keys)))
  52.      (princ ", invoking disabled command "))
  53.        (princ this-command)
  54.        (princ ":\n")
  55.        ;; Print any special message saying why the command is disabled.
  56.        (if (stringp (get this-command 'disabled))
  57.        (princ (get this-command 'disabled)))
  58.        (princ (or (condition-case ()
  59.               (documentation this-command)
  60.             (error nil))
  61.           "<< not documented >>"))
  62.        ;; Keep only the first paragraph of the documentation.
  63.        (save-excursion
  64.      (set-buffer "*Help*")
  65.      (goto-char (point-min))
  66.      (if (search-forward "\n\n" nil t)
  67.          (delete-region (1- (point)) (point-max))
  68.        (goto-char (point-max))))
  69.        (princ "\n\n")
  70.        (princ "You can now type
  71. Space to try the command just this once,
  72.       but leave it disabled,
  73. Y to try it and enable it (no questions if you use it again),
  74. N to do nothing (command remains disabled)."))
  75.      (message "Type y, n or Space: ")
  76.      (let ((cursor-in-echo-area t))
  77.        (while (not (memq (setq char (downcase (read-char)))
  78.              '(?  ?y ?n)))
  79.      (ding)
  80.      (message "Please type y, n or Space: "))))
  81.     (if (= char ?y)
  82.     (if (and user-init-file
  83.          (not (string= "" user-init-file))
  84.          (y-or-n-p "Enable command for future editing sessions also? "))
  85.         (enable-command this-command)
  86.       (put this-command 'disabled nil)))
  87.     (if (/= char ?n)
  88.     (call-interactively this-command))))
  89.  
  90. ;;;###autoload
  91. (defun enable-command (command)
  92.   "Allow COMMAND to be executed without special confirmation from now on.
  93. The user's .emacs file is altered so that this will apply
  94. to future sessions."
  95.   (interactive "CEnable command: ")
  96.   (put command 'disabled nil)
  97.   (save-excursion
  98.    (set-buffer (find-file-noselect
  99.         (substitute-in-file-name user-init-file)))
  100.    (goto-char (point-min))
  101.    (if (search-forward (concat "(put '" (symbol-name command) " ") nil t)
  102.        (delete-region
  103.     (progn (beginning-of-line) (point))
  104.     (progn (forward-line 1) (point)))
  105.      ;; Must have been disabled by default.
  106.      (goto-char (point-max))
  107.      (insert "\n(put '" (symbol-name command) " 'disabled nil)\n"))
  108.    (save-buffer)))
  109.  
  110. ;;;###autoload
  111. (defun disable-command (command)
  112.   "Require special confirmation to execute COMMAND from now on.
  113. The user's .emacs file is altered so that this will apply
  114. to future sessions."
  115.   (interactive "CDisable command: ")
  116.   (if (not (commandp command))
  117.       (error "Invalid command name `%s'" command))
  118.   (put command 'disabled t)
  119.   (save-excursion
  120.    (set-buffer (find-file-noselect
  121.         (substitute-in-file-name user-init-file)))
  122.    (goto-char (point-min))
  123.    (if (search-forward (concat "(put '" (symbol-name command) " ") nil t)
  124.        (delete-region
  125.     (progn (beginning-of-line) (point))
  126.     (progn (forward-line 1) (point))))
  127.    (goto-char (point-max))
  128.    (insert "(put '" (symbol-name command) " 'disabled t)\n")
  129.    (save-buffer)))
  130.  
  131. ;;; novice.el ends here
  132.